#ifndef NURBS_H
#define NURBS_H

#include <QPointF>
#include <QtOpenGL/QtOpenGL>
#include <cassert>
#include "Utilities/structures.h"

using std::vector;

class Nurbs
{
public:
    Nurbs( double degree );

    /* Pola publiczne. */
    curve_options options;           // Opcje wyswietlania krzywej.
                                     // To trzeba bedzie zamienic na metode ustawiajaca maski bitowe.

    /* Metody. */
    QPointF Eval( double t );
    vector< QPointF > ComputePoints( int numberOfPoints );
    void AddControlPoint( QPointF dbPoint, double weight );
    void MovePoint( int index, QPointF new_position );
    void MoveCurve( QPointF vec );
    void Draw( );

private:
    /* Pola */
    vector< QPointF > control_points; // Punkty de Boora.
    vector< double > weights;         // Wagi punktow de Boora.
    vector< double > knots;           // Wezly.
    int degree;                       // Stopien krzywej.
    int num_of_knots;                 // Liczba wezlow.

    /* Metody prywatne. */
    void GlCircle3i( GLint x, GLint y, GLint radius ); // To trzeba wywalic gdzie do nadrzednej klasy,
                                                     // bo sie powtarza tez w Bezierze.
    void UpdateKnots( );
    int FindIndex( double t );
    void DrawCurve( );            // Metody rysujace tez sie powtarzaja, trzeba cos z tym zrobic.
    void DrawControlPolyline( );
    void DrawControlPoints( );
};

#endif // NURBS_H
